package in.rob.client;
import in.lib.Constants;
import in.lib.adapter.AccountAdapter;
import in.lib.adapter.AutoCompleteAdapter;
import in.lib.adapter.CreateChannelAdapter;
import in.lib.adapter.PhonePageAdapter;
import in.lib.handler.base.UserStreamResponseHandler;
import in.lib.loader.base.Loader;
import in.lib.manager.APIManager;
import in.lib.manager.CacheManager;
import in.lib.manager.UserManager;
import in.lib.thread.FragmentRunnable;
import in.lib.view.UserSuggestView;
import in.model.SimpleUser;
import in.model.Stream;
import in.model.User;
import in.model.base.NetObject;
import in.rob.client.base.RobinSlidingActivity;
import in.rob.client.dialog.NewChannelDialog;
import in.rob.client.dialog.base.DialogBuilder;
import in.rob.client.page.ChannelsPage;
import in.rob.client.page.UserFriendsPage;
import in.rob.client.page.base.StreamFragment;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
public class ChannelsActivity extends RobinSlidingActivity
{
private CreateChannelAdapter channelAdapter;
@Override public void setup(boolean isPhone)
{
LinkedHashMap<Class, Bundle> pages = new LinkedHashMap<Class, Bundle>();
Bundle extras = new Bundle();
Bundle bundle1 = new Bundle(extras);
bundle1.putString(Constants.EXTRA_TITLE, getString(R.string.channels));
pages.put(ChannelsPage.class, bundle1);
PhonePageAdapter adapter = new PhonePageAdapter(this, getSupportFragmentManager(), getViewPager(), pages, getSupportActionBar().getCustomView());
setAdapter(adapter);
getViewPager().setAdapter(adapter);
getAdapter().setIndicatorVisible(false);
}
@Override public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.channel, menu);
return super.onCreateOptionsMenu(menu);
}
@Override public boolean onOptionsItemSelected(MenuItem item)
{
if (item == null) return false;
if (item.getItemId() == R.id.menu_new_channel)
{
ArrayList<SimpleUser> list = new ArrayList<SimpleUser>();
list.add(SimpleUser.parseFromUser(UserManager.getUser()));
channelAdapter = new CreateChannelAdapter(getContext(), R.layout.user_channel_dialog_list_item, list);
newChannel();
return true;
}
if (item.getItemId() == android.R.id.home)
{
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
public void lockOrientation()
{
switch (getResources().getConfiguration().orientation)
{
case Configuration.ORIENTATION_PORTRAIT:
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else
{
int rotation = getWindowManager().getDefaultDisplay().getRotation();
if (rotation == android.view.Surface.ROTATION_90 || rotation == android.view.Surface.ROTATION_180)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
else
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
break;
case Configuration.ORIENTATION_LANDSCAPE:
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
else
{
int rotation = getWindowManager().getDefaultDisplay().getRotation();
if (rotation == android.view.Surface.ROTATION_0 || rotation == android.view.Surface.ROTATION_90)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
else
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
}
}
break;
}
}
public void newChannel()
{
lockOrientation();
DialogBuilder.create(getContext())
.setTitle(R.string.add_users)
.setCancelable(false)
.setAdapter(channelAdapter, null)
.setNegativeButton(R.string.cancel, new OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
})
.setNeutralButton(R.string.add_user, new OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
addUser();
}
})
.setPositiveButton(R.string.next, new OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
ArrayList<SimpleUser> list = new ArrayList<SimpleUser>();
int count = channelAdapter.getCount();
for (int index = 0; index < count; index++)
{
list.add((SimpleUser)channelAdapter.getItem(index));
}
if (count < 1 || !list.contains(UserManager.getUser()))
{
list.add(SimpleUser.parseFromUser(UserManager.getUser()));
}
Intent channelMessage = new Intent(getContext(), NewChannelDialog.class);
channelMessage.putExtra(Constants.EXTRA_USER_LIST, list);
startActivity(channelMessage);
}
})
.show();
}
private AutoCompleteAdapter adapter;
public void addUser()
{
View v = getLayoutInflater().inflate(R.layout.search_user, null, false);
final UserSuggestView suggest = (UserSuggestView)v.findViewById(R.id.search_user);
List<NetObject> l = new ArrayList<NetObject>();
adapter = new AutoCompleteAdapter(getContext(), l);
suggest.setAdapter(adapter);
suggest.setThreshold(2);
suggest.setDropDownBackgroundResource(R.drawable.profile_avatar_fade);
new CacheLoader().execute();
Dialog dialog = DialogBuilder.create(getContext())
.setTitle(R.string.search_users)
.setView(v)
.setOnCancelListener(new OnCancelListener()
{
@Override public void onCancel(DialogInterface dialog)
{
newChannel();
}
})
.setNegativeButton(R.string.close, new OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
newChannel();
}
})
.setPositiveButton(R.string.add_user, new OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
InputMethodManager m = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
m.hideSoftInputFromWindow(suggest.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
if (suggest.getSelectedUser() == null)
{
final ProgressDialog loader = new ProgressDialog(getContext());
loader.setMessage(getString(R.string.searching_for_user));
loader.show();
UserStreamResponseHandler response = new UserStreamResponseHandler(getContext(), false)
{
@Override public void onCallback()
{
List<SimpleUser> users = CacheManager.getInstance().readFileAsObject(Constants.CACHE_USERNAMES, new ArrayList<SimpleUser>());
List<String> usersStr = CacheManager.getInstance().readFileAsObject(Constants.CACHE_USERNAMES_STR, new ArrayList<String>());
for (NetObject o : getObjects())
{
User u = (User)o;
if (!usersStr.contains(u.getId()))
{
users.add(SimpleUser.parseFromUser(u));
usersStr.add(u.getId());
u.save();
}
}
CacheManager.getInstance().writeFile(Constants.CACHE_USERNAMES, users);
CacheManager.getInstance().writeFile(Constants.CACHE_USERNAMES_STR, usersStr);
runOnUiThread(responseRunner);
}
private FragmentRunnable<StreamFragment> responseRunner = new FragmentRunnable<StreamFragment>()
{
@Override public void run()
{
if (getObjects().size() > 0)
{
if (getObjects().size() > 1)
{
final AccountAdapter userAdapter = new AccountAdapter(getContext(), R.layout.account_list_item, getObjects());
DialogBuilder.create(getContext())
.setTitle(R.string.select_user)
.setOnCancelListener(new OnCancelListener()
{
@Override public void onCancel(DialogInterface dialog)
{
addUser();
}
})
.setAdapter(userAdapter, new OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
channelAdapter.appendItem(userAdapter.getItem(which));
newChannel();
dialog.dismiss();
}
})
.show();
}
else
{
if (channelAdapter.getItemById(getObjects().get(0).getId()) == null)
{
channelAdapter.appendItem(getObjects().get(0));
}
newChannel();
}
}
else
{
DialogBuilder.create(getContext())
.setTitle(R.string.error)
.setMessage(R.string.unfound_user)
.setNegativeButton(R.string.close, new OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
addUser();
}
})
.show();
}
loader.dismiss();
//super.run();
}
};
};
APIManager.getInstance().searchUsers(suggest.getText().toString(), "", response);
}
else
{
if (channelAdapter.getItemById(suggest.getSelectedUser().getId()) == null)
{
channelAdapter.appendItem(suggest.getSelectedUser());
}
newChannel();
}
}
})
.create();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();
}
class CacheLoader extends Loader<List<NetObject>>
{
public CacheLoader()
{
super("");
}
@Override public List<NetObject> doInBackground()
{
List<SimpleUser> users = CacheManager.getInstance().readFileAsObject(Constants.CACHE_USERNAMES, new ArrayList<SimpleUser>());
List<NetObject> tags = new ArrayList<NetObject>();
if (users.size() < 1)
{
// load default followers/following list and add them to the autocomplete
Stream following = CacheManager.getInstance().readFileAsObject(String.format(Constants.CACHE_USER_LIST_NAME, UserFriendsPage.Mode.FOLLOWING.getModeText(), UserManager.getUserId()), Stream.class);
Stream followers = CacheManager.getInstance().readFileAsObject(String.format(Constants.CACHE_USER_LIST_NAME, UserFriendsPage.Mode.FOLLOWERS.getModeText(), UserManager.getUserId()), Stream.class);
if (following != null)
{
for (NetObject object : following.getObjects())
{
users.add(SimpleUser.parseFromUser((User)object));
}
}
if (followers != null)
{
for (NetObject object : followers.getObjects())
{
users.add(SimpleUser.parseFromUser((User)object));
}
}
CacheManager.getInstance().asyncWriteFile(Constants.CACHE_USERNAMES, users);
}
tags.addAll(users);
return tags;
}
@Override public void onPostExecute(List<NetObject> tags)
{
adapter.setItems(tags);
adapter.notifyDataSetChanged();
}
}
}